-
-
Notifications
You must be signed in to change notification settings - Fork 119
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
deps: migrate from Enzyme to RTL #88
Conversation
- Enzyme only has unofficial support for React 17 and no support what-so-ever for React 18, so forced to migrate - RTL is most certainly more of an integration testing library than a unit test library - can't access the instance through RTL, even though this component actually _needs_ to use refs (bc canvas) - I managed to hack around this by using refs, but I honestly wasn't even sure that this was possible - notably hooks like `useRef` don't work since they can only be used inside of a React component or another hook - but callback refs and `createRef` do work fortunately - tried to use `react-dom-instance` initially, as suggested in blog post by the author, but it only works with React 16 - in React 17 and React 18 it just returns `false` and doesn't get an instance - `querySelector` is an escape hatch that is not recommended, enough so that I read through the docs multiple times before finding it was even possible - was using `document.querySelector` directly before finding this - somewhat replaces Enzyme's `exists` - `rerender` is also a bit of an escape hatch - notably, you can't set props directly on a `ref`, `.props` is a read-only property, so had to find some alternative to be able to run the tests - replaces Enzyme's `setProps` - had to change `clearOnResize` to an optional type as it was required without this - despite that it's in `defaultProps`; the interface itself can't infer this, so probably makes sense to make it optional here as well
Codecov Report
@@ Coverage Diff @@
## main #88 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 1 1
Lines 75 75
Branches 9 9
=========================================
Hits 75 75
Continue to review full report at Codecov.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Was a non-trivial refactor with lots of different issues, but the end code diff I achieved is actually relatively small! LGTM
* deps: migrate from Enzyme to RTL - Enzyme only has unofficial support for React 17 and no support what-so-ever for React 18, so forced to migrate - RTL is most certainly more of an integration testing library than a unit test library - can't access the instance through RTL, even though this component actually _needs_ to use refs (bc canvas) - I managed to hack around this by using refs, but I honestly wasn't even sure that this was possible - notably hooks like `useRef` don't work since they can only be used inside of a React component or another hook - but callback refs and `createRef` do work fortunately - tried to use `react-dom-instance` initially, as suggested in blog post by the author, but it only works with React 16 - in React 17 and React 18 it just returns `false` and doesn't get an instance - `querySelector` is an escape hatch that is not recommended, enough so that I read through the docs multiple times before finding it was even possible - was using `document.querySelector` directly before finding this - somewhat replaces Enzyme's `exists` - `rerender` is also a bit of an escape hatch - notably, you can't set props directly on a `ref`, `.props` is a read-only property, so had to find some alternative to be able to run the tests - replaces Enzyme's `setProps` - had to change `clearOnResize` to an optional type as it was required without this - despite that it's in `defaultProps`; the interface itself can't infer this, so probably makes sense to make it optional here as well * fix lint issues
Summary
Migrate testing framework from Enzyme to React Testing Library (RTL).
This paves the way for support for React 18 (#76), as it was not possible to test with Enzyme due to the lack of React 18 adapter.
Details
Enzyme only has unofficial, partial support for React 17 (Support for React 17 enzymejs/enzyme#2429) and no support what-so-ever for React 18 (Support for React 18 enzymejs/enzyme#2524), so forced to migrate (see also add React 17 to peerDep range -- needs to update devDeps and tests #64 (review) and React 18 support in peerDeps #76 (comment))
RTL is most certainly more of an integration testing library than a unit test library
useRef
don't work since they can only be used inside of a React component or another hookcreateRef
do work fortunatelyreact-dom-instance
initially, as suggested in a blog post by the author, but it only works with React 16 (see the issue I filed w/ repro: Doesn't work with React 17 or React 18 arqex/react-dom-instance#14)false
and doesn't get an instancequerySelector
is an escape hatch that is not recommended, enough so that I read through the docs multiple times before finding it was even possibledocument.querySelector
directly before finding thisexists
rerender
is also a bit of an escape hatchref
,.props
is a read-only property, so had to find some alternative to be able to run the testssetProps
had to change
clearOnResize
to an optional type as it was required without thisdefaultProps
; the interface itself can't infer this, so probably makes sense to make it optional here as wellNext Steps
I tested this with React 18 as well and everything worked, so next PRs will add support for React 18 in peerDeps (#76)